# coding:utf-8
'''登陆视图'''

from ihome.api_1_0 import api
from flask import request, jsonify, current_app, session
from ihome.utils.response_code import RET
import re
from ihome.models import User
from werkzeug.security import check_password_hash
from ihome import redis_store
from ihome import constants


@api.route('/login', methods=['POST'])
def login():
    """
    接收参数: json格式 mobile  pwd
    验证参数:
    业务逻辑:
    返回

    细节处理:
            防止暴力测试,就是将当前访问ip,如果错误10次,那么下次访问时间限制在10分钟过后
    :return:
    """

    req_dict = request.get_json()
    if not req_dict:
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完全")

    mobile = req_dict.get('mobile')
    pwd = req_dict.get('pwd')

    # 参数验证
    if not all([mobile, pwd]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完全")

    if not re.match(r'1[3578]\d{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号出错")

    # 去数据库验证之前,看暴力测试的次数,如果大于5,则直接返回
    ip = request.remote_addr
    try:
        nums = redis_store.get('ip%s' % ip)
    except Exception as e:
        current_app.logger.error(e)
    else:
        if nums >= 5:
            current_app.logger.info('ip--%s--暴力测试' % ip)
            return jsonify(errno=RET.REQERR, errmsg="非法测试")

    # 从数据库读取mobile,与pwd
    try:
        real_user = User.query.filter_by(mobile=mobile).first()

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库读取失败')

    if not real_user:
        # 不存在,则无此用户
        # todo 这里设置暴力测试限制
        # 如果错误,则将ip存储在redis中
        # ip = request.remote_addr
        # current_app.logger.info('%s--暴力测试' % ip)
        redis_store.incr('ip%s' % ip)
        redis_store.expire('ip%s' % ip, constants.VIOLENT_TEST_LIMIT)

        return jsonify(errno=RET.USERERR, errmsg="用户名或密码错误")

    real_pwd_hash = real_user.password_hash

    if not check_password_hash(real_pwd_hash, pwd):
        # todo 这里设置暴力测试限制
        # 如果错误,则将ip存储在redis中
        # ip = request.remote_addr
        # current_app.logger.info('%s--暴力测试' % ip)
        redis_store.incr('ip%s' % ip)
        redis_store.expire('ip%s' % ip, constants.VIOLENT_TEST_LIMIT)
        return jsonify(errno=RET.PWDERR, errmsg="用户名或密码错误")

    # 返回登陆成功消息
    # todo  session存储用户信息
    session['user_id'] = real_user.id
    session['user_name'] = real_user.name
    session['user_mobile'] = real_user.mobile
    return jsonify(errno=RET.OK, errmsg="登陆成功")
